/**
 * A JuzKezt reprezentáló osztály.
 */
public class Player extends Entity {
  /**
   * Belső változó amiben az éppen lerakásra váró bomba tárolódik.
   */
  Bomb bomb = null;

  /**
   * Mozgatja a játékost az adott irányba.
   * @param direction A mozgás iránya
   * @param depth A mozgás maximális mélysége.
   * @return True, ha a mozgás sikerült.
   */
  @Override
  public boolean move(int direction, int depth) {
    SkeletonHelper.FunctionBegin(ID, "Player", "move");
    
    Field targetField = field.getNeighbour(direction);
    if (targetField.isEmpty()) //Ha a célmező üres, léphetünk oda.
      doMove(targetField);
    else
    {
      Entity targetEntity = targetField.getEntity();
      Boolean b = targetEntity.dig();
      if (b) //Ha ki lehet ásni, odaléphetünk
        doMove(targetField);
      else
      {  //ha nem, aktiváljuk azt a mezőt, hátha olyan, akit ez érint (pl szörny)
        targetEntity.activate();
        if (targetEntity.move(direction, depth-1))
          doMove(targetField);
      }
    }
    
    SkeletonHelper.FunctionEnd(ID, "Player", "move", "true");
    return true;
  }

  /**
   * Belső függvény a mozgással kapcsolatos összes lépés végrehajtására.
   * (Ha van bomba Juzkeznél, leteszi a lépés után oda, ahol eddig állt.)
   * @param targetField A cél mező, ahová lépni kell.
   */
  private void doMove(Field targetField)
  {
    field.delete();
    if (bomb != null)
    {
      field.add(bomb);
      bomb = null;
    }
    targetField.add(this);
  }

  /**
   * Kér egy új Bomb példányt a Game osztálytól.
   */
  public void setBomb() {
    SkeletonHelper.FunctionBegin(ID, "Player", "setBomb");

    bomb = field.getGame().createBomb();

    SkeletonHelper.FunctionEnd(ID, "Player", "setBomb");
  }

  /**
   * Megöli a játékost.
   * @return Mindig True
   */
  @Override
  public boolean kill() {
    SkeletonHelper.FunctionBegin(ID, "Player", "kill");
    field.getGame().killPlayer();
    SkeletonHelper.FunctionEnd(ID, "Player", "kill", "true");
    return true;
  }

  /**
   * Kinyírja JuzKezt.
   * @return Mindíg True.
   */
  @Override
  public boolean explode() {
    SkeletonHelper.FunctionBegin(ID, "Player", "explode");

    game.killPlayer();

    SkeletonHelper.FunctionEnd(ID, "Player", "explode", "true");
    return true;
  }

  /**
   * Kinyírja JuzKezt.
   * @return Mindíg True.
   */
  @Override
  public boolean eat() {
    SkeletonHelper.FunctionBegin(ID, "Player", "eat");

    game.killPlayer();

    SkeletonHelper.FunctionEnd(ID, "Player", "eat", "true");
    return true;
  }
}